"""
车牌识别系统自动安装脚本
帮助用户快速设置环境和依赖
"""

import os
import sys
import subprocess
import platform
from pathlib import Path


def run_command(command, description=""):
    """
    运行命令并处理输出
    
    参数：
        command (str): 要运行的命令
        description (str): 命令描述
        
    返回值：
        bool: 是否成功
    """
    print(f"正在执行: {description or command}")
    
    try:
        result = subprocess.run(
            command,
            shell=True,
            capture_output=True,
            text=True,
            encoding='utf-8'
        )
        
        if result.returncode == 0:
            print("✓ 成功")
            return True
        else:
            print(f"✗ 失败: {result.stderr}")
            return False
            
    except Exception as e:
        print(f"✗ 执行失败: {e}")
        return False


def check_python_version():
    """
    检查Python版本
    
    返回值：
        bool: 版本是否符合要求
    """
    print("检查Python版本...")
    
    version = sys.version_info
    if version.major >= 3 and version.minor >= 8:
        print(f"✓ Python {version.major}.{version.minor}.{version.micro} 符合要求")
        return True
    else:
        print(f"✗ Python {version.major}.{version.minor}.{version.micro} 版本过低，需要3.8+")
        return False


def create_virtual_environment():
    """
    创建虚拟环境
    
    返回值：
        bool: 是否成功
    """
    print("\n创建虚拟环境...")
    
    if Path("venv").exists():
        print("✓ 虚拟环境已存在")
        return True
    
    return run_command("python -m venv venv", "创建虚拟环境")


def activate_virtual_environment():
    """
    激活虚拟环境
    
    返回值：
        str: 激活命令
    """
    system = platform.system()
    
    if system == "Windows":
        activate_cmd = "venv\\Scripts\\activate"
    else:
        activate_cmd = "source venv/bin/activate"
    
    print(f"虚拟环境激活命令: {activate_cmd}")
    return activate_cmd


def install_dependencies():
    """
    安装依赖包
    
    返回值：
        bool: 是否成功
    """
    print("\n安装依赖包...")
    
    # 检查requirements.txt是否存在
    if not Path("requirements.txt").exists():
        print("✗ requirements.txt 文件不存在")
        return False
    
    # 获取pip命令
    system = platform.system()
    if system == "Windows":
        pip_cmd = "venv\\Scripts\\pip"
    else:
        pip_cmd = "venv/bin/pip"
    
    # 升级pip
    print("升级pip...")
    run_command(f"{pip_cmd} install --upgrade pip", "升级pip")
    
    # 安装依赖
    return run_command(f"{pip_cmd} install -r requirements.txt", "安装依赖包")


def create_directories():
    """
    创建必要的目录
    
    返回值：
        bool: 是否成功
    """
    print("\n创建目录结构...")
    
    directories = [
        "models",
        "output",
        "logs",
        "temp",
    ]
    
    success_count = 0
    
    for directory in directories:
        try:
            Path(directory).mkdir(exist_ok=True)
            print(f"✓ 创建目录: {directory}")
            success_count += 1
        except Exception as e:
            print(f"✗ 创建目录失败 {directory}: {e}")
    
    return success_count == len(directories)


def test_installation():
    """
    测试安装结果
    
    返回值：
        bool: 是否成功
    """
    print("\n测试安装结果...")
    
    # 获取python命令
    system = platform.system()
    if system == "Windows":
        python_cmd = "venv\\Scripts\\python"
    else:
        python_cmd = "venv/bin/python"
    
    # 测试核心模块导入
    test_commands = [
        f"{python_cmd} -c \"import cv2; print('OpenCV:', cv2.__version__)\"",
        f"{python_cmd} -c \"import torch; print('PyTorch:', torch.__version__)\"",
        f"{python_cmd} -c \"import ultralytics; print('Ultralytics: OK')\"",
        f"{python_cmd} -c \"import easyocr; print('EasyOCR: OK')\"",
        f"{python_cmd} -c \"import PySide6; print('PySide6: OK')\"",
    ]
    
    success_count = 0
    
    for cmd in test_commands:
        if run_command(cmd, ""):
            success_count += 1
    
    print(f"\n依赖测试完成: {success_count}/{len(test_commands)} 个库可用")
    return success_count == len(test_commands)


def create_startup_scripts():
    """
    创建启动脚本
    
    返回值：
        bool: 是否成功
    """
    print("\n创建启动脚本...")
    
    system = platform.system()
    
    if system == "Windows":
        # Windows批处理脚本已经存在
        if Path("run_gui.bat").exists():
            print("✓ Windows启动脚本已存在")
            return True
    else:
        # Linux/macOS shell脚本
        if Path("run_gui.sh").exists():
            # 设置执行权限
            try:
                os.chmod("run_gui.sh", 0o755)
                print("✓ Linux/macOS启动脚本已存在并设置执行权限")
                return True
            except Exception as e:
                print(f"✗ 设置执行权限失败: {e}")
                return False
    
    return False


def main():
    """
    主安装函数
    """
    print("=" * 60)
    print("车牌识别系统自动安装程序")
    print("=" * 60)
    
    # 检查Python版本
    if not check_python_version():
        print("\n请升级Python版本到3.8或更高版本")
        return 1
    
    # 创建虚拟环境
    if not create_virtual_environment():
        print("\n虚拟环境创建失败")
        return 1
    
    # 安装依赖
    if not install_dependencies():
        print("\n依赖安装失败")
        return 1
    
    # 创建目录
    if not create_directories():
        print("\n目录创建失败")
        return 1
    
    # 测试安装
    if not test_installation():
        print("\n安装测试失败，可能存在依赖问题")
        print("请检查网络连接和pip配置")
        return 1
    
    # 创建启动脚本
    create_startup_scripts()
    
    print("\n" + "=" * 60)
    print("安装完成！")
    print("=" * 60)
    
    # 显示使用说明
    print("\n使用说明:")
    print("1. 启动GUI界面:")
    
    system = platform.system()
    if system == "Windows":
        print("   双击运行 run_gui.bat")
        print("   或者运行: python main.py")
    else:
        print("   运行: ./run_gui.sh")
        print("   或者运行: python main.py")
    
    print("\n2. 使用命令行工具:")
    print("   python cli.py -h  # 查看帮助")
    print("   python cli.py -i image.jpg  # 处理单张图像")
    
    print("\n3. 运行系统测试:")
    print("   python test_system.py")
    
    print("\n注意事项:")
    print("- 首次运行会自动下载YOLO模型文件")
    print("- 首次使用OCR会下载语言模型")
    print("- 建议使用GPU版本的PyTorch以获得更好性能")
    
    return 0


if __name__ == "__main__":
    sys.exit(main()) 